package Form;

import java.util.Date;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import Creche.Bd.BD;
import Creche.Main.Creche;
import Creche.Personne.Personne;

public class DemandeForm {

	private static final String CHAMP_NOM = "nom";
	private static final String CHAMP_PRENOM = "prenom";
	private static final String CHAMP_DATE = "date";
    private static final String CHAMP_TEL = "tel";
    private static final String CHAMP_EMAIL = "email";
    
    private String resultat;
    private boolean inscrit;
    private HashMap<String,String> erreurs = new HashMap<String,String>();
    
    /**
     * @return le resultat du formulaire
     */
    public String getResultat() {
        return resultat;
    }
    
    
    /**
     * @return vrai si une personne est déjà inscrite
     */
    public boolean getInscrit() {
    	return inscrit;
    }
    
    
    /**
     * @return la map des erreurs saisis dans le formulaire
     */
    public HashMap<String,String> getErreurs() {
        return erreurs;
    }
    
    
    /**
     * Inscrit une personne après validation du formulaire 
     * @param requette de la servlet
     * @return personne
     */
    public Personne inscrirePers(HttpServletRequest req) {
    	
    	String nom = req.getParameter(CHAMP_NOM).trim();
    	String prenom = req.getParameter(CHAMP_PRENOM).trim();
    	String date = req.getParameter(CHAMP_DATE).trim();
        String tel = req.getParameter(CHAMP_TEL).trim();
        String email = req.getParameter(CHAMP_EMAIL).trim();
     
        /**
         * On récupère la creche pour laquelle on va réaliser
         * la demande d'inscription
         */
        Creche c = (Creche) req.getSession().getAttribute("creche");
        
        Personne pers = new Personne("nom", "prenom", "date");
        AdresseForm adr = new AdresseForm(req, erreurs, pers);
        
        /* Validation du champ nom */
        try {
            validationNom(nom);
            pers.setNom(nom);
        } catch (Exception e) {
            setErreur(CHAMP_NOM, e.getMessage());
        }
        
        
        /* Validation du champ prénom */
        try {
            validationPrenom(prenom);
            pers.setPrenom(prenom);
        } catch (Exception e) {
            setErreur(CHAMP_PRENOM, e.getMessage());
        }
        
        
        /* Validation du champ date de naissance */
        try {
            validationDate(date);
        	pers.setDate(date);
        } catch (Exception e) {
            setErreur(CHAMP_DATE, e.getMessage());
        }
        
        
        /* Validation de l'adresse complète */
        pers.setAdresse(adr.getAdresse());
        
        
        /* Validation du champ téléphone */
        try {
            validationTel(tel);
            pers.setTel(tel);
        } catch (Exception e) {
            setErreur(CHAMP_TEL, e.getMessage());
        }
        
        
        /* Validation du champ email */
        try {
            validationEmail(email);
            pers.setEmail(email);
        } catch (Exception e) {
            setErreur(CHAMP_EMAIL, e.getMessage());
        }
        
        BD myBD = new BD();
        inscrit = myBD.isRegister(c, pers);
        
        /* Initialisation du résultat global de la validation */
        if (erreurs.isEmpty() && !inscrit) {
        	myBD.addPersBD(c, pers);
        }
        else if (erreurs.isEmpty() && inscrit) {
        	resultat = "Vous avez déjà fait une demande d'inscription";
        } 
        else {
            resultat = "Echec de la demande d'inscription";
        }
     
        return pers;
    }
    
    
    /**
     * Crée un message d'erreur si nom invalide ou non saisi
     * @param nom saisi par l'utilisateur
     */
    private void validationNom(String nom) throws Exception {
    	if (!nom.isEmpty()) {
        	if (!nom.matches( "([a-zA-Z][-]?)+")) {
        		throw new Exception("Nom invalide");
        	}
        }
        else {
            throw new Exception("Veuillez saisir un nom");
        }
    }
    
    
    /**
     * Crée un message d'erreur si prénom invalide ou non saisi
     * @param prénom saisi par l'utilisateur
     */
    private void validationPrenom(String prenom) throws Exception {
        if (!prenom.isEmpty()) {
        	if (!prenom.matches( "([a-zA-Z][-]?)+")) {
        		throw new Exception("Prénom invalide");
        	}
        }
        else {
            throw new Exception("Veuillez saisir un prénom");
        }
    }
    
    
    /**
     * Crée un message d'erreur si date non saisie ou invalide
     * @param date de naissance
     */
    @SuppressWarnings("deprecation")
	private void validationDate(String date) throws Exception {
    	Date d = new Date();
    	 
    	String str[] = date.split("/");
    	int jour = Integer.parseInt(str[0]);
    	int mois = Integer.parseInt(str[1]);
    	
        if (date.isEmpty()) {
        	throw new Exception("Veuillez saisir une date");
        }
        else if (mois > d.getMonth()+1) {
        	throw new Exception("Date invalide");
        }
        else if (jour > d.getDate()) {
        	throw new Exception("Date invalide");
        }
    }
    
    
    /**
     * Crée un message d'erreur si numéro de téléphone invalide ou non saisi
     * @param numéro de téléphone saisi par l'utilisateur
     */
    private void validationTel(String tel) throws Exception {
    	if (!tel.isEmpty()) {
    		if (!tel.matches( "[0-9]{10}" )) {
    			throw new Exception("Numéro de téléphone invalide");
    		}
    	}
    	else {
    		throw new Exception("Veuillez saisir un numéro de téléphone");
    	}
    }
    
    
    /**
     * Crée un message d'erreur si email invalide ou non saisi
     * @param email saisi par l'utilisateur
     */
    private void validationEmail(String email) throws Exception {
        if (!email.isEmpty()) {
            if (!email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" )) {
                throw new Exception("Adresse email invalide");
            }
        } 
        else {
            throw new Exception("Veuillez saisir une adresse email");
        }
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }
}
